home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2002 November / SGI Freeware 2002 November - Disc 2.iso / dist / fw_jade.idb / usr / freeware / include / sp / lib / Mutex.h.z / Mutex.h
C/C++ Source or Header  |  1999-07-21  |  2KB  |  126 lines

  1. // Copyright (c) 1996 James Clark
  2. // See the file copying.txt for copying permission.
  3.  
  4. #ifndef Mutex_INCLUDED
  5. #define Mutex_INCLUDED 1
  6.  
  7. #ifdef SP_MUTEX_WIN32
  8. #define SP_MUTEX
  9.  
  10. #define STRICT 1
  11. #include <windows.h>
  12. // <windows.h> appears to turn these warnings back on
  13. #ifdef _MSC_VER
  14. #pragma warning ( disable : 4237 )
  15. #endif
  16.  
  17. #ifdef SP_NAMESPACE
  18. namespace SP_NAMESPACE {
  19. #endif
  20.  
  21. class Mutex {
  22. public:
  23.   class Lock {
  24.   public:
  25.     Lock(Mutex *mp) : mp_(mp) {
  26.       if (mp) ::EnterCriticalSection(&mp->cs_);
  27.     }
  28.     ~Lock() {
  29.       if (mp_) ::LeaveCriticalSection(&mp_->cs_);
  30.     }
  31.   private:
  32.     Mutex *mp_;
  33.   };
  34.   Mutex() {
  35.     ::InitializeCriticalSection(&cs_);
  36.   }
  37.   ~Mutex() {
  38.     ::DeleteCriticalSection(&cs_);
  39.   }
  40.   friend class Lock;
  41. private:
  42.   CRITICAL_SECTION cs_;
  43. };
  44.  
  45. #ifdef SP_NAMESPACE
  46. }
  47. #endif
  48.  
  49. #endif /* SP_MUTEX_WIN32 */
  50.  
  51. #ifdef SP_MUTEX_MACH
  52. #define SP_MUTEX
  53.  
  54. #ifdef SP_NAMESPACE
  55. namespace SP_NAMESPACE {
  56. #endif
  57.  
  58. #ifdef SP_NAMESPACE
  59. }
  60. #endif
  61.  
  62. #endif /* SP_MUTEX_MACH */
  63.  
  64. #ifdef SP_MUTEX_PTHREADS
  65.  
  66. // Support for pthreads on Linux.
  67. // Written by Matthias Clasen <clasen@mathematik.uni-freiburg.de>
  68.  
  69. #define SP_MUTEX
  70.  
  71. #ifdef SP_NAMESPACE
  72. namespace SP_NAMESPACE {
  73. #endif
  74.  
  75. extern "C" {
  76. #include <pthread.h>
  77. }
  78.  
  79. class Mutex {
  80. public:
  81.   class Lock {
  82.   // Lock serves to automatically unlock Mutex, however control leaves
  83.   // a block. Don't let any "warning: unused variable `class Mutex::Lock lock'"
  84.   // mislead you; hopefully your compiler won't optimise this away...
  85.   public:
  86.     Lock(Mutex *mp) : mp_(mp) { if (mp_) pthread_mutex_lock  (&mp_->cs_); }
  87.     ~Lock()                   { if (mp_) pthread_mutex_unlock(&mp_->cs_); }
  88.   private:
  89.     Mutex *mp_;
  90.   };
  91.   Mutex()  { pthread_mutex_init (&cs_, NULL); }
  92.   ~Mutex() { pthread_mutex_destroy (&cs_); }
  93.   friend class Lock;
  94. private:
  95.   pthread_mutex_t cs_;
  96. };
  97.  
  98. #ifdef SP_NAMESPACE
  99. }
  100. #endif
  101.  
  102. #endif /* SP_MUTEX_PTHREADS */
  103.  
  104. #ifndef SP_MUTEX
  105.  
  106. #ifdef SP_NAMESPACE
  107. namespace SP_NAMESPACE {
  108. #endif
  109.  
  110. class Mutex {
  111. public:
  112.   class Lock {
  113.   public:
  114.     Lock(Mutex *) { }
  115.   };
  116.   Mutex() { }
  117. };
  118.  
  119. #ifdef SP_NAMESPACE
  120. }
  121. #endif
  122.  
  123. #endif /* not SP_MUTEX */
  124.  
  125. #endif /* not Mutex_INCLUDED */
  126.